package com.sunwayworld.baseline.framework;

import com.sunwayworld.framework.context.ApplicationContextHelper;
import com.sunwayworld.framework.security.bean.LoginUser;
import com.sunwayworld.framework.security.service.DefaultUserDetailsChecker;
import com.sunwayworld.framework.security.sso.SsoAuthenticator;
import com.sunwayworld.framework.utils.ServletUtils;
import com.sunwayworld.module.mdm.user.bean.CoreUserBean;
import com.sunwayworld.module.mdm.user.service.CoreUserService;
import org.springframework.security.authentication.BadCredentialsException;

import javax.servlet.http.HttpServletRequest;

/**
 * @ClassName EiSsoAuthenticator
 * @Author zhoujq
 * @Date 2022/8/5
 * @Version 1.0
 **/
public class FeishuSsoAuthenticator implements SsoAuthenticator {

    @Override
    public LoginUser authenticate() {
        HttpServletRequest request = ServletUtils.getCurrentRequest();
        // 获取单点登录传递过来的参数信息，如用户名和密码等，根据实际情况自行定义
        String userId = request.getParameter("userId");
        String password = request.getParameter("password");

        // 验证用户信息，根据实际情况自行验证
        CoreUserService userService = ApplicationContextHelper.getBean(CoreUserService.class);
        CoreUserBean user = userService.selectByIdIfPresent(userId);
        if (user == null) {
            throw new BadCredentialsException("GIKAM.SECURITY.LOGIN.INCORRECT_USER_OR_PASSWORD");
        }

        // 验证用户名和密码是否正确，如果不需验证用户名和密码则不需要写该行
        DefaultUserDetailsChecker.checkPassword(userId, password);

        LoginUser loginUser = new LoginUser(userId, user.getPassword());
        /**
         * setAdditionalCheck(true)：设置为true时，系统会自动进行校验用户名和密码匹配、密码是否过期，验证失败会将密码错误次数+1，错误次数达到预设最大错误次数，会锁定该用户
         * setAdditionalCheck(false): 设置为false时，不会进行如上校验
         * AdditionalCheck 默认为true
         */
        loginUser.setAdditionalCheck(true);

        loginUser.setOrgName(user.getOrgName());
        loginUser.setOrgId(user.getOrgId());
        return loginUser;
    }

    /**
     * 是否登录到我们系统，有时候仅仅是获取数据，不需要登录
     * true: 登录到我们系统
     * false: 不登录到我们系统，获取数据用
     */
    @Override
    public boolean login() {
        return true;
    }

    /**
     * 用户退回时进行的操作
     */
    @Override
    public void logout() {
    }

}
